﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;

namespace SoftHotel.Models
{
    public class Trabajador : IValidatableObject
    {
        [Key]
        public int idTrabajador	{ get; set; }

        [Required(ErrorMessage = "El campo Sede es requerido.")]
        public int idSede { get; set; }

        [Required(ErrorMessage = "El campo Estado civil es requerido.")]
        public int estadoCivil { get; set; }

        [Required(ErrorMessage = "El campo Sexo es requerido.")]
        public int sexo { get; set; }

        [Required(ErrorMessage = "El campo Departamento es requerido.")]
        public int departamento { get; set; }

        [Required(ErrorMessage = "El campo Provincia es requerido.")]
        public int provincia { get; set; }

        [Required(ErrorMessage = "El campo Cargo es requerido.")]
        public int cargo { get; set; }

        [NotMapped]
        [DisplayName("Horario")]
        public int horario { get; set; }

        [Required(ErrorMessage = "El campo Estado es requerido.")]
        public int estado { get; set; }

        [Required(ErrorMessage = "El campo Tipo de documento es requerido.")]
        public int tipoDoc { get; set; }

        [Required(ErrorMessage = "El campo Número de documento es requerido.")]
        [DisplayName("Número de documento")]
        public string numDoc { get; set; }

        [Required(ErrorMessage = "El campo Nombres es requerido.")]
        [DisplayName("Nombres")]
        public string nombres { get; set; }

        [Required(ErrorMessage = "El campo Apellido paterno es requerido.")]
        [DisplayName("Apellido paterno")]
        public string apellidoPaterno { get; set; }

        [DisplayName("Apellido materno")]
        public string apellidoMaterno { get; set; }

        [Required(ErrorMessage = "El campo Fecha de nacimiento es requerido.")]
        [DisplayName("Fecha de nacimiento")]
        public DateTime fechaNacimiento { get; set; }

        [DisplayName("Teléfono")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public String telefono { get; set; }

        [DisplayName("Móvil")]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public String movil { get; set; }

        [DisplayName("Correo electrónico")]
        [RegularExpression("[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}", ErrorMessage = "Sintaxis incorrecta")]
        public string email { get; set; }

        [Required(ErrorMessage = "El campo Dirección es requerido.")]
        [DisplayName("Dirección")]
        public string direccion { get; set; }

        [DisplayName("Sede")]
        public Sede sede { get; set; }

        [ForeignKey("tipoDoc")]
        [DisplayName("Tipo de documento")]
        public Parametro pTipoDoc { get; set; }
        
        [ForeignKey("estadoCivil")]
        [DisplayName("Estado civil")]
        public Parametro pEstadoCivil { get; set; }

        [ForeignKey("sexo")]
        [DisplayName("Sexo")]
        public Parametro pSexo { get; set; }

        [ForeignKey("departamento")]
        [DisplayName("Departamento")]
        public Parametro pDepartamento { get; set; }

        [ForeignKey("provincia")]
        [DisplayName("Provincia")]
        public Parametro pProvincia { get; set; }

        [ForeignKey("cargo")]
        [DisplayName("Cargo")]
        public Parametro pCargo { get; set; }

        [ForeignKey("estado")]
        [DisplayName("Estado")]
        public Parametro pEstado { get; set; }

        [DisplayName("Nombre")]
        public string nombreCompleto { get { return apellidoPaterno + " " + apellidoMaterno + ", " + nombres + " | " + pTipoDoc.valor + ": " + numDoc; } }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            TrabajadorDAO trabajadorDAO = new TrabajadorDAO();
            if (trabajadorDAO.Trabajadores.Any(a => a.numDoc == this.numDoc && a.tipoDoc == this.tipoDoc))
                yield return new ValidationResult("Trabajador existente", new string[] { "numDoc", "tipoDoc" });
        }

    }

    public class sTrabajador
    {
    //  Clase que sirve para las búsquedas de trabajador 
        [DisplayName("Sede")]
        public int idSede { get; set; }
        [DisplayName("Cargo")]
        public int cargo { get; set; }
        [DisplayName("Horario")]
        public int horario { get; set; }
        [DisplayName("Estado")]
        public int estado { get; set; }
        [DisplayName("Tipo de documento")]
        public int tipoDoc { get; set; }
        [DisplayName("Número de documento")]
        public string numDoc { get; set; }
        [DisplayName("Nombres")]
        public string nombres { get; set; }
        [DisplayName("Apellido paterno")]
        public string apellidoPaterno { get; set; }
        [DisplayName("Apellido materno")]
        public string apellidoMaterno { get; set; }

    }
}